/*
 * @description: 
 * @Author: wzg
 * @Date: 2021-03-08 08:42:12
 * @LastEditTime: 2021-03-22 11:56:22
 */

import Koa from 'koa'; /* web框架 */
import koaBody from 'koa-body'; /* 获取body中的数据 */
import cors from 'koa2-cors';/* 解决跨域 */
import moment from 'moment';/* 日期格式化 */
import koaJwt from 'koa-jwt';/* 解析校验jwt */
import KoaLogger from 'koa-logger';/* 控制台打印出每个请求的时间 */
import log4js from 'koa-log4';/* 日志打印中间件 */
const { getLogger } = log4js;
const log = getLogger('index');
import { accessLogger } from './utils/log4.js';/* 日志记录中间件 */
import { controller, allowedMethods } from './utils/controller.js';
import { result } from './middleware/result.js';/* 处理返回结果 */
import { catchException } from './middleware/catchException.js';/* 异常处理 */
import { jwtSecret } from './config/config.js';/* 配置文件 */
import { filterPath as path } from './utils/filterPath.js';/* jwt过滤的路径 */

const app = new Koa();
// 使用日志中间件
const logger = KoaLogger((str) => {
  /* 打印每一个请求的时间 与请求信息 */
  console.log(moment().format('YYYY-MM-DD HH:mm:ss') + str);
});
app.use(logger);

app.use(cors()); /* 解决跨域问题 */

// parse request body:
/* 使用这个中间件就可以获取body里的数据 POST,PUT传值 */
app.use(
  koaBody({
    multipart: true /* 支持文件上传 */
  })
);
/* 日志记录中间件 */
app.use(accessLogger());

/* 异常处理中间件 */
app.use(catchException);

/* jwt 中间件 */
app.use(koaJwt({
  secret: jwtSecret
}).unless({
  /* 过滤，不需要校验jwt的接口 */
  path
}));

/* 格式化返回数据的格式 
这段代码一定要写在 jwt 中间件的后面，而不能是前面
*/
app.use(result());


/* 可以做一些日志记录的操作 */
app.use(async (ctx, next) => {
  /* ctx.state包含了jwt中解析出来的数据默认存储在user对象中 */
  console.log(ctx.state.user);
  // console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);
  await next();
});

// add controllers:
app.use(controller());
app.use(allowedMethods());

// 在端口3000监听:
app.listen(3001);
console.log('app started at port 3001...');
/*
1.获取url问号后面的值ctx.query，它会转化为一个对象
2.获取动态路由的值ctx.params
3.获取body中的数据，需要引入相关的插件koa-body即可
*/